/*
* 
* Fichier source projet intel Acceler8 sous license GNU GPL v3.
* Voir http://www.gnu.org/copyleft/gpl.html pour plus d'informations
* La license est egalement disponible dans le repertoire /doc
* 
* Cree le : mercredi 09 novembre 2011 à 21 : 25.
* Auteurs : Axel MOINET et Arnaud DURAND.
* 
* Nom de fichier : threadprincipal.cpp
* Chemin du fichier : ./src/classes/threadprincipal/threadprincipal.cpp
* 
* Description : Classe d'implémentation du thread principal.
* 			Gère la communication entre les différentes composantes du programme.
* 
*/
#include "threadprincipal.h"

threadPrincipal::threadPrincipal(int p_nbJetonsLecture, int p_nbJetonsCalcul, char *p_filepath) {
	//Initialiser le tableau de somme de préfixes
	this->tableau = new tableauSommePrefixe();
	this->cghTab = new tbb::concurrent_vector<tbb::concurrent_vector<int> >();
	this->endfile = false;
	this->cghComputeEnding = false;
	this->computeEnding = false;
	this->resultatFinal = new struct result;
	this->resultatFinal->a = 0;
	this->resultatFinal->b = 0;
	this->resultatFinal->g = 1;
	this->resultatFinal->h = 1;
	this->resultatFinal->S = -32000;
	this->g = new int(1);
	this->h = new int(1);
	this->nbJetonsLecture = p_nbJetonsLecture;
	this->nbJetonsCalcul = p_nbJetonsCalcul;
	this->filepath = p_filepath;
}

threadPrincipal::~threadPrincipal() {
	delete this->tableau;
}

tableauSommePrefixe* threadPrincipal::getPrefixeTab() {
	return this->tableau;
}

FLAG threadPrincipal::getEndFileFlag() {
	return this->endfile;
}

int threadPrincipal::pushBackCghTab(tbb::concurrent_vector<int> *p_cgh) {
	if(p_cgh == NULL) {
		//Renvoyer une exception pointeur nul
		return -1;
	}
	else {
		(*(this->cghTab)).push_back(*p_cgh);
		return 0;
	}
}

int threadPrincipal::setEndFileFlag() {
	this->endfile = true;
	return 0;
}

tbb::concurrent_vector<tbb::concurrent_vector<int> >* threadPrincipal::getCghTab() {
	return this->cghTab;
}

int threadPrincipal::setCghComputeEndingFlag() {
	this->cghComputeEnding = true;
	return 0;
}

FLAG threadPrincipal::getCghComputeEndingFlag() {
	return this->cghComputeEnding;
}

int threadPrincipal::setComputeEndingFlag() {
	this->computeEnding = true;
	return 0;
}

FLAG threadPrincipal::getComputeEndingFlag() {
	return this->computeEnding;
}

struct result* threadPrincipal::getStructureResult() {
	return this->resultatFinal;
}
